package module.library.service.impl;


import common.model.Entity.libraryEntity.enums.BookStatus;
import dao.LibraryDao.BookDao;
import dao.LibraryDao.BookItemDao;
import dao.impl.LibraryDaoImpl.BookDaoImpl;
import dao.impl.LibraryDaoImpl.BookItemDaoImpl;
import common.model.Entity.libraryEntity.Book;
import common.model.Entity.libraryEntity.BookItem;
import module.library.service.BookQueryService;
import network.protocol.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class BookQueryServiceImpl implements BookQueryService {
    private static final Logger logger= LoggerFactory.getLogger(BookQueryServiceImpl.class);

    // 实例化 DAO，遵循 StudentServiceImpl 的模式
    private final BookDao bookDao = new BookDaoImpl();
    private final BookItemDao bookItemDao = new BookItemDaoImpl();

    private static final BookQueryService INSTANCE = new BookQueryServiceImpl();
    // 私有构造方法，防止外部创建实例
    private BookQueryServiceImpl() {}

    // 公开的静态获取方法，提供全局访问点
    public static BookQueryService getInstance() {
        return INSTANCE;
    }
    /**
     * 根据书名、作者或 ISBN 关键字进行模糊搜索
     *
     * @param keyword
     * @return
     */
    @Override
    public Response<List<Book>> searchBooksByField(String keyword,String searchType) {
        if (keyword == null || keyword.trim().isEmpty()) {
            return Response.success(List.of());
        }

        List<Book> books;

        // 如果查询没有选择查询类型，则使用的是模糊查询
        if(searchType==null || searchType.trim().isEmpty()){
            books = bookDao.searchBooks(keyword);       // 已改
        }else{      // 如果选择了查询类型，则按类型查询
            books=bookDao.searchBooksByField(keyword,searchType);
        }
        return Response.success(books);     // 返回的是列表 需要解开列表？？？  在后端解开再传回？还是先传回再由前端解开？
    }

    /**
     * 根据图书ID获取某本书的详细信息。
     *
     * @param isbn 图书ID，图书的唯一标识。
     * @return 匹配的图书对象，如果未找到则返回 null。
     */
    @Override
    public Response<Book> getBookDetails(String isbn) {
        if (isbn == null) {
            return Response.error("图书ID不能为空");
        }
        Optional<Book> bookOptional = bookDao.findByIsbn(isbn);
        if (bookOptional.isEmpty()) {
            logger.warn("未找到图书，bookIsbn={}", isbn);
            return Response.error("未找到该图书信息");
        }
        return Response.success(bookOptional.get());
    }

    /**
     * 获取某本图书的所有副本信息  用的是图书副本表中的根据isbn查询 用来展示前端的馆藏信息
     * 结合前端的图书详情页
     */
    @Override
    public Response<List<BookItem>> getBookItems(String isbn) {
        if(isbn==null || isbn.trim().isEmpty()){
            return Response.error("图书isbn不能为空");
        }
        List<BookStatus> allStatus = Arrays.asList(BookStatus.AVAILABLE, BookStatus.RESERVED,BookStatus.BORROWED);
        Optional<List<BookItem>> bookItemOptional = bookItemDao.findByBookIsbnAndStatus(isbn,allStatus);

        if(!bookItemOptional.isPresent()){
            return Response.error("该书没有复本");
        }
        return Response.success(bookItemOptional.get());
    }
}
